package com.mini.mybatis.session;

import java.io.Closeable;
import java.util.List;

/**
 * SqlSession接口 - 定义数据库操作的核心方法
 * 这是MyBatis的主要Java接口，通过这个接口可以执行命令、获取映射器和管理事务
 */
public interface SqlSession extends Closeable {
    
    /**
     * 查询单个对象
     * @param statement 语句ID
     * @return 查询结果对象
     */
    <T> T selectOne(String statement);
    
    /**
     * 查询单个对象，带参数
     * @param statement 语句ID
     * @param parameter 参数对象
     * @return 查询结果对象
     */
    <T> T selectOne(String statement, Object parameter);
    
    /**
     * 查询对象列表
     * @param statement 语句ID
     * @return 查询结果列表
     */
    <E> List<E> selectList(String statement);
    
    /**
     * 查询对象列表，带参数
     * @param statement 语句ID
     * @param parameter 参数对象
     * @return 查询结果列表
     */
    <E> List<E> selectList(String statement, Object parameter);
    
    /**
     * 插入操作
     * @param statement 语句ID
     * @return 影响的行数
     */
    int insert(String statement);
    
    /**
     * 插入操作，带参数
     * @param statement 语句ID
     * @param parameter 参数对象
     * @return 影响的行数
     */
    int insert(String statement, Object parameter);
    
    /**
     * 更新操作
     * @param statement 语句ID
     * @return 影响的行数
     */
    int update(String statement);
    
    /**
     * 更新操作，带参数
     * @param statement 语句ID
     * @param parameter 参数对象
     * @return 影响的行数
     */
    int update(String statement, Object parameter);
    
    /**
     * 删除操作
     * @param statement 语句ID
     * @return 影响的行数
     */
    int delete(String statement);
    
    /**
     * 删除操作，带参数
     * @param statement 语句ID
     * @param parameter 参数对象
     * @return 影响的行数
     */
    int delete(String statement, Object parameter);
    
    /**
     * 提交事务
     */
    void commit();
    
    /**
     * 回滚事务
     */
    void rollback();
    
    /**
     * 清理缓存
     */
    void clearCache();
    
    /**
     * 获取映射器
     * @param type 映射器接口类型
     * @return 映射器实例
     */
    <T> T getMapper(Class<T> type);
    
    /**
     * 获取配置信息
     * @return Configuration配置对象
     */
    Configuration getConfiguration();
}